import request from '@/utils/request'

export interface ChatRequest {
  message: string
  conversation_id?: string
  formData?: {
    // 通用字段（多个专家共用）
    productName?: string
    targetAudience?: string
    coreSellingPoint?: string
    
    // AI诊断专家专用字段
    productCategory?: string
    targetAgeRange?: string
    targetRegion?: string
    adBudget?: string
    campaignDuration?: string
    coreGoal?: string
    
    // 目标客群画像专用字段
    industry?: string
    productType?: string
    targetArea?: string
    coreFunction?: string
    priceRange?: string
    salesChannel?: string
    ageRange?: string
    gender?: string
    occupation?: string
    incomeLevel?: string
    referenceGoal?: string
    interests?: string
    channel?: string
    useScenario?: string
    
    // 广告活动策划专用字段
    name?: string
    type?: string
    sellingPoint?: string
    brandValue?: string
    age?: string
    region?: string
    interestTags?: string
    totalBudget?: string
    mainPeriod?: string
    warmupPeriod?: string
    competitorBrands?: string
    preferredChannel?: string
    targetKPI?: string
    brand?: string
    audienceInterestTags?: string
    
    // AI标题生成器专用字段
    brandTone?: string
    keywords?: string
    characterLimit?: string
    
    // AI媒体文案专用字段
    keySellingPoint?: string
    callToAction?: string
    wordLimit?: string
    
    // AI落地页搭建专用字段
    industryType?: string
    coreConversionGoal?: string
    budgetRange?: string
    platform?: string
    industryFeatures?: string
    regulatoryLimitations?: string
    brandVisualGuidelines?: string
    historicalDataReference?: string
    
    // 基础表单数据（其他专家使用）
    productService?: string
    coreRequirement?: string
  }
}

export interface ChatResponse {
  text?: string
  content?: string
  image?: string
  type: 'text' | 'image' | 'mixed'
}

// 流式响应数据接口
export interface StreamResponse {
  delta: string
  finished: boolean
  message_id?: string
  event?: string
  answer?: string
}

// 发送AI聊天消息
export function sendAiChatMessage(data: ChatRequest): Promise<ChatResponse> {
  return request.post({
    url: '/api/ai-chat',
    data
  })
}

// 发送流式AI聊天消息
export async function sendAiChatStreamMessage(
  data: string | ChatRequest,
  title: string,
  onChunk: (chunk: string) => void,
  onFinished: () => void,
  onError: (error: Error) => void
): Promise<void> {
  try {

    console.log('datata', data);
    console.log('title',title);
    var token_local = localStorage.getItem('__like_admin_saas_tenant__token');
    if (!token_local) {
      throw new Error('未找到授权信息');
    }
    var token_arr = JSON.parse(token_local);

    const apiUrl: string = import.meta.env.VITE_APP_BASE_URL || '';
    // console.log('apiurl',apiUrl);

    // 处理数据格式
    let requestPayload: any;
    if (typeof data === 'string') {
      requestPayload = { "type": title, "content": data };
    } else {
      // 如果是对象，包含表单数据
      requestPayload = { 
        "type": title, 
        "content": data.message,
        "formData": data.formData
      };
    }

    const response = await fetch(apiUrl+'/tenantapi/dashboard.dashboard/aiStream', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'text/event-stream',
        'Token': token_arr?.value || ''
      },
      body: JSON.stringify(requestPayload)
    })

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const reader = response.body?.getReader()
    if (!reader) {
      throw new Error('无法创建响应流读取器')
    }

    const decoder = new TextDecoder()
    let buffer = ''

    while (true) {
      const { done, value } = await reader.read()

      if (done) {
        onFinished()
        break
      }

      buffer += decoder.decode(value, { stream: true })
      const lines = buffer.split('\n')
      buffer = lines.pop() || ''

      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const dataStr = line.slice(6).trim()
          if (dataStr === '[DONE]') {
            onFinished()
            return
          }

          try {
            const data: StreamResponse = JSON.parse(dataStr)
            console.log('stream_data', data);
            if (data.event == 'message' && data.answer != '') {
              console.log(data.answer);
              onChunk(data.answer || '')
            }
            if (data.event == 'end') {
              onFinished()
              return
            }
          } catch (e) {
            console.warn('解析流式数据失败:', e)
          }
        }
      }
    }
  } catch (error) {
    onError(error instanceof Error ? error : new Error('未知错误'))
  }
}

// 模拟流式响应 - 开发阶段使用
export async function mockAiStreamResponse(
  message: string,
  onChunk: (chunk: string) => void,
  onFinished: () => void,
  onError: (error: Error) => void
): Promise<void> {
  try {
    // 获取完整回复内容
    const response = mockAiResponse(message)
    const fullText = response.text || response.content || '抱歉，我暂时无法回答这个问题。'

    // 模拟逐字输出
    const chunks = fullText.split('')
    let currentIndex = 0

    const streamInterval = setInterval(() => {
      if (currentIndex < chunks.length) {
        // 模拟有时候一次输出多个字符
        const chunkSize = Math.random() > 0.7 ? Math.floor(Math.random() * 3) + 1 : 1
        const chunk = chunks.slice(currentIndex, currentIndex + chunkSize).join('')
        onChunk(chunk)
        currentIndex += chunkSize
      } else {
        clearInterval(streamInterval)
        onFinished()
      }
    }, 50 + Math.random() * 100) // 随机延时，模拟真实网络情况

  } catch (error) {
    onError(error instanceof Error ? error : new Error('模拟流式响应失败'))
  }
}

// 模拟响应 - 实际开发时可以删除
export function mockAiResponse(message: string): ChatResponse {
  // 简单的模拟回复
  if (message.includes('数据') || message.includes('分析')) {
    return {
      text: `<think>
用户询问数据分析相关问题，我需要：
1. 分析当前广告投放的核心指标
2. 识别问题和机会点
3. 提供具体的优化建议
4. 制定可执行的行动计划

从用户的问题看，他们关注数据表现，我应该从成本、转化、流量三个维度来分析。
</think>

根据您的广告数据分析，我为您提供以下建议：

## 📊 数据诊断结果

### 💰 成本优化建议
- **当前消耗情况**：建议优化高消耗低转化的关键词
- **CPC成本**：可通过调整出价策略降低15-20%
- **投放时段**：建议重点投放10:00-14:00和19:00-22:00

### 🎯 转化率提升方案
1. **创意优化**：更换表现较差的广告创意
2. **着陆页优化**：提升页面加载速度和用户体验
3. **人群定向**：精准定位目标客群，提升转化质量

### 📈 下周执行计划
- 暂停低质量关键词
- 增加高转化时段的投放预算
- 测试3-5组新的创意素材

需要我为您详细分析某个具体的数据指标吗？`,
      type: 'text'
    }
  }

  if (message.includes('策略') || message.includes('计划')) {
    return {
      text: `<think>
用户询问策略规划，这需要从长远角度思考：
1. 分析当前投放阶段
2. 制定分阶段的策略
3. 考虑预算分配和风险控制
4. 提供可量化的目标

我需要提供一个完整的、可执行的策略框架。
</think>

## 🚀 广告投放策略建议

### 阶段性投放计划
**第一阶段（1-2周）**：测试期
- 小预算测试多组创意
- 收集用户行为数据
- 优化投放参数

**第二阶段（3-4周）**：优化期  
- 基于数据调整策略
- 扩大高效果广告组预算
- 优化低效果素材

**第三阶段（5周+）**：规模化
- 复制成功经验
- 扩大投放规模
- 持续监控效果

您希望我为您制定具体哪个行业的投放策略？`,
      type: 'text'
    }
  }

  if (message.includes('你好') || message.includes('您好')) {
    return {
      text: `<think>
用户刚开始对话，这是一个欢迎和介绍的机会。我需要：
1. 友好地回应问候
2. 清楚介绍我的能力
3. 引导用户提出具体问题
4. 营造专业且友好的氛围
</think>

您好！很高兴为您服务 😊

我是您的AI诊断专家，可以为您提供：
- 🔍 **广告数据深度分析**
- 💡 **投放策略优化建议** 
- 📊 **成本控制方案**
- 🎯 **转化率提升指导**

请告诉我您遇到的具体问题，我会为您提供专业的诊断和建议！`,
      type: 'text'
    }
  }

  // 默认回复
  return {
    text: `<think>
这是一个通用问题，我需要：
1. 提供有价值的通用建议
2. 保持专业性
3. 引导用户提供更多具体信息
4. 展示我的分析能力
</think>

感谢您的提问！基于您的问题，我建议：

## 💡 专业建议

1. **数据监控**：建议您每日关注关键指标变化
2. **策略调整**：根据实时数据及时优化投放策略  
3. **效果评估**：定期分析投放效果并制定改进方案

如果您有具体的数据指标或遇到特定问题，我可以为您提供更精准的分析和建议。

请问您还有其他需要咨询的问题吗？`,
    type: 'text'
  }
} 